
//// 函数式接口
//@FunctionalInterface
//interface NoParameterNoReturn {
//    //注意：只能有一个方法，但现在有两个
//    void test();
//
//}

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}


//无返回值 多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}



//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

//无返回值 一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
public class Lambda {
    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "hello");
        map.put(2, "bit");
        map.put(3, "hello");
        map.put(4, "lambda");
        map.forEach((key,value)-> System.out.println("key:"+key +" value:"+value));
        System.out.println("换行 ===========================");
        map.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer integer, String s) {
                System.out.println("key:"+integer +" value:"+s);
            }
        });
    }
    public static void main8(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add("bit");
        list.add("lambda");
        list.add("Hello");
        // 创建一个 Consumer 的 匿名类
//        list.forEach(new Consumer<String>() {
//            // accept 其实就是 接收 数组每次传过来 一个字符串
//            @Override
//            public void accept(String str) {
//                // 其目的就是打印。
//                System.out.print(str + " ");
//            }
//        });
//        System.out.println();// 换行
//        list.forEach(s->System.out.println(s));
        // 假设 我们在输出完以后，要进行排序
//        System.out.println("换行=================");
        list.sort((o1,o2)->o1.compareTo(o2));// 一个升序的比较规则
        list.forEach(s-> System.out.println(s));
        System.out.println("----------------");
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        list.forEach(s-> System.out.println(s));
    }

    public static void main7(String[] args) {
        int size=4;
//        size = 99;
        OneParameterNoReturn o =  a -> {System.out.println(a);
            System.out.println(size);};
        o.test(2);
    }

    public static void main6(String[] args) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(5, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        // 优化
        PriorityQueue<Integer> minHeap2 = new PriorityQueue<>(5,(o1,o2)->o1-o2);
    }

    public static void main5(String[] args) {
        MoreParameterReturn m =  (a,b)-> {return  a+b;};
        System.out.println(m.test(2, 3));
        // 简化
        MoreParameterReturn m2 = (a,b) -> a+b;
        System.out.println(m2.test(3,3));
    }
    public static void main4(String[] args) {
        OneParameterReturn o = (a) -> a + 10;
        System.out.println(o.test(1));
    }

    public static void main3(String[] args) {
        NoParameterReturn n = () -> {return 10; };
        int ret = n.test();
        System.out.println(ret);
        // 简化
        NoParameterReturn n2 = () ->5;
        ret = n2.test();
        System.out.println(ret);
    }
    public static void main2(String[] args) {
        MoreParameterNoReturn m = (a,b)->System.out.println(a+b);
        m.test(1,2);
    }

    public static void main1(String[] args) {
//        OneParameterNoReturn o = (a)-> {System.out.println(a);};
//        o.test(10);
//        OneParameterNoReturn o = a-> System.out.println(a);
        OneParameterNoReturn o =  System.out::println;
        o.test(3);
    }

//    public static void main2(String[] args) {
//        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("test");
//        noParameterNoReturn.test();
//    }
//    public static void main1(String[] args) {
//        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn(){
//            @Override
//            public void test(){
//                System.out.println("重写 test");
//            }
//        };
//        noParameterNoReturn.test();// 调用test方法。
//    }
}
